//
//  DateInterval.swift
//  Documentation
//
//  Created by Toj on 11/14/23.
//

@available(macOS 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *)
public struct DateInterval : ReferenceConvertible, Comparable, Hashable, Codable, Sendable {

    public typealias ReferenceType = NSDateInterval

    /// 开始时间
    public var start: Date
    /// 结束时间
    public var end: Date

    /// 持续时间
    public var duration: TimeInterval

    /// 初始化
    public init()
    
    /**
     初始化
     - parameter start: 开始时间
     - parameter end: 结束时间
     */
    public init(start: Date, end: Date)

    /**
     初始化
     - parameter start: 开始时间
     - parameter duration: 持续时间
     */
    public init(start: Date, duration: TimeInterval)

    /// 比较
    public func compare(_ dateInterval: DateInterval) -> ComparisonResult

    /// 与dateInterval是否有交集
    public func intersects(_ dateInterval: DateInterval) -> Bool

    /// dateInterval的交集, 无交集则返回nil
    public func intersection(with dateInterval: DateInterval) -> DateInterval?

    /// 是否包含某日期
    public func contains(_ date: Date) -> Bool

    public func hash(into hasher: inout Hasher)

    @available(macOS 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *)
    public static func == (lhs: DateInterval, rhs: DateInterval) -> Bool

    @available(macOS 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *)
    public static func < (lhs: DateInterval, rhs: DateInterval) -> Bool

    public func encode(to encoder: Encoder) throws

    public var hashValue: Int { get }

    public init(from decoder: Decoder) throws
}
